package DataStructure.ArrayLearning.Iterator;

public interface MyList<E> {
    /**
     * 末尾添加元素
     *
     * @param e 待添加元素
     * @return 是否添加成功
     */
    boolean add(E e);

    /**
     * 在指定索引处添加元素
     *
     * @param index 指定索引
     * @param e     待添加元素
     * @return 是否添加成功
     */
    boolean add(int index, E e);

    /**
     * 删除指定元素
     *
     * @param e 待删除元素
     * @return 是否删除元素
     */
    boolean remove(E e);

    /**
     * 删除指定索引处的元素
     *
     * @param index 指定索引
     * @return 返回删除的元素
     */
    E remove(int index);


    /**
     * 判断指定元素是否存在
     *
     * @param e 指定元素
     * @return 存在返回 ture，不存在返回 false
     */
    boolean contains(E e);

    /**
     * 查找指定索引的元素
     *
     * @param index 指定索引
     * @return 返回对应元素
     */
    E get(int index);

    /**
     * 替换指定元素
     *
     * @param oldValue 原始值
     * @param newValue 新值
     * @return 是否替换成功
     */
    boolean set(E oldValue, E newValue);

    /**
     * 替换指定索引处的值
     *
     * @param index    指定索引
     * @param newValue 新值
     * @return 被替换的旧值
     */
    E set(int index, E newValue);

    /**
     * 清空列表
     */
    void clear();

    /**
     * 返回指定元素第一次出现的下标
     *
     * @param e 指定元素
     * @return 下标，未找到则返回 -1
     */
    int indexOf(E e);

    /**
     * 返回指定元素最后一次出现的下标
     *
     * @param e 指定元素
     * @return 下标，未找到则返回 -1
     */
    int lastIndexOf(E e);

    /**
     * 判空
     *
     * @return 列表为空时返回 true
     */
    boolean isEmpty();

    /**
     * 返回列表大小
     *
     * @return 列表大小
     */
    int size();

    /**
     * 返回此列表的迭代器
     *
     * @return 此列表的迭代器
     */
    MyIterator<E> iterator();

    /**
     * 返回此列表的迭代器，并移动到指定下标之前
     *
     * @param index 指定的索引，表示 next() 所返回的第一个值的索引
     * @return 此列表的迭代器
     */
    MyIterator<E> iterator(int index);
}
